約 4,725,154 件
https://w.atwiki.jp/blitz3d/pages/25.html
ネタ元はこちら ボーン MilkShapeはボーンアニメーションをサポートしています。 ボーンアニメーションを簡単に説明すると、まずモデルに骨(ボーン)を入れ、その骨を動かすと関連する面や頂点が自動で骨に追従して動きます。 (人形に針金を入れて、その針金を動かすイメージで大体あってます。) ボーンの集合をスケルトンと呼びます。 MilkShapeには人気ゲームで使われているスケルトンが付属しています。MilkShapeのフォルダーを開いてみましょう。 MilkShapeフォルダーからvalve_skeleton.ms3dを探してMilkShapeで開いてみてください。これはHalf-Lifeのモデルに対応しているスケルトンです。 スケルトンだけ見ても、人体であることが分かります。このスケルトンは人体アニメーションを作る時に非常に便利です。 では、このスケルトンを使って簡単な人体アニメーションを作っていきましょう。 基礎知識 アニメーションは「フレーム」と言う時間単位を持ちます。 1フレームは1秒に満たないごく短い時間です。 フレームごとに少しずつスケルトンの動作を変更していくことで、最終的にアニメーションすることになります。 ここでポイントとして押さえておきたいのが、全フレームを手作業で作る必要はないということです。 手作業で行うのは、要所要所のポーズを決めることだけ。 間のフレームはコンピューターが計算して勝手に作ってくれます。 MilkShapeのアニメーションバー(Animation-bar)は私たちに全フレームを見せてくれます。 今、私たちは 0 フレーム目にいます。10フレーム目にキーフレームを設定して、ポーズを変更してみましょう。 10フレーム目だけポーズを変更すれば、0フレーム目~10フレーム目までの間のアニメーションはMilkShapeが勝手に作ってくれます。 ※ キーフレームとは、手動でポーズを作るフレームのことを指します そうですね、ここでは片手を上げる簡単なアニメーションを作ってみましょう。 アニメーションパネルについて アニメーションを作るには、まずアニメーションパレットをアクティブにする必要があります。 右下のAnimボタンをクリックしましょう。 するとAnimボタンの横にある全てのボタンがアクティブになり、フレームバーもいじれるようになります。 フレームバーを使用すると別のフレームに移動することができます。 MilkShapeはデフォルトで100フレームを定義していますが、右下の値を書き換えることでフレームを増減させることができます。 (下図でいうと 10 が入力されているところです) ここでは、30フレームに変更しましょうね。 ボーンを動かしてみよう ModelタブのToolsからSelectボタンをクリックしてください。 Selectボタンをクリックしたら、忘れずに、Select OptionsでJointを選んでくださいね。 フロントビューで、スケルトンの右肩を選択しましょう。 選択されたボーンは緑色になります。言い換えると、緑色のボーンは選択状態です。 赤く表示されているのは、ジョイント(関節)です。 今は右肩を選択したので、右肩のジョイントが赤くなり、右肩のジョイントに接続されているボーン全体が緑色になりました。 えー間違いないですね? ジョイントやボーンは階層構造(ヒエラルキー)になっていて、親を動かすと子も動くようになっています。 簡単に言うと、根元を動かすと根元にくっついている先っぽも動く。そんな感じです。 では、早速今表示されているポーズをフレーム1に保存してみましょう。(キーフレームを作成してみましょう) キーフレームを定義するには、2種類の方法があって、それぞれ以下のような定義方法です。 全てのボーンをキーフレームとする 選択中のボーンのみキーフレームとする ここでは1番の方法でキーフレームを定義することを推奨します。 よって、全てのボーンをキーフレームとして定義してください。 全てのボーンをキーフレームとして定義するには、まずAnimateメニューをクリックして、「Operate On Selected Joints Only」のチェックを外す必要があります。 上図ではチェックがついてますね。下図のようにチェックを外してください。 オーケー、じゃあキーフレームを作成しましょう。 Animateメニューの「Set Keyframe」をクリックすればキーフレームが作成されます。 #ref error :ご指定のファイルが見つかりません。ファイル名を確認して、再度指定してください。 (241.jpg) フレームバーを使って、別のフレームに移動してみてください。 そして、また元のフレームに戻してみましょう。 どうですか? 前と表示が変わっていますでしょう。 #ref error :ご指定のファイルが見つかりません。ファイル名を確認して、再度指定してください。 (242.jpg) そう、全てのボーンが黄色になってますね。 黄色のボーンはキーフレームとして定義されていることを意味します。 あぁ、つまり全てのボーンがちゃんとキーフレームとして定義されたということです。 はい、じゃあフレームバーを使って、15フレーム目に移動してください。 移動しました? 次にModelタブのToolsから「Rotate」をクリックしてください。 #ref error :ご指定のファイルが見つかりません。ファイル名を確認して、再度指定してください。 (243.jpg) トップビューで、さっき選択した左肩を回転させてください。 #ref error :ご指定のファイルが見つかりません。ファイル名を確認して、再度指定してください。 (244.jpg) フロントビューで回転具合を確かめてみましょう。ちゃんと回転してたら下図のようになるはずですよ。 #ref error :ご指定のファイルが見つかりません。ファイル名を確認して、再度指定してください。 (245.jpg) トップビューではこんな感じになります。 #ref error :ご指定のファイルが見つかりません。ファイル名を確認して、再度指定してください。 (246.jpg) さて、右腕を動かしたところでキーフレームを設定しましょう。 そこで、今私たちは右腕しか動かしてませんよね?
https://w.atwiki.jp/hmiku/pages/19125.html
ちゅーとりある【登録タグ ち マンボウの姉 今日犬(ジャムおじさんP) 初音ミク 曲】 作詞:今日犬(ジャムおじさんP) 作曲:今日犬(ジャムおじさんP) 編曲:今日犬(ジャムおじさんP) 唄:初音ミク 曲紹介 エンディングまで 泣くんじゃない ピッチを少しずらしているのは仕様。 イラストは マンボウの姉氏 が、動画を koishi氏 が手掛ける。マスタリングは kaichi氏 。 歌詞 チュッ チュッ チュッ 今宵の明かりを 隠した木の近くで 柔らかな 口付けを いくつもの影を 潜り抜けて 未来を誓い合った はずなのに ゲームみたいに終わっちまった ゲームみたいに終わっちまった ゲームみたいに終わっちまった ゲームみたいに終わっちまった チュッ チュッ チュッ チューと リアル 此処にあるのに 何かがない チュッ チュッ チュッ チューと リアル 終わらなければいいのになあ ああ 大事な話があると 聞いた 爽やかな夏の 日差しが照る あなたの願いが 叶う日まで どこでも一緒だと 思っていたのに ゲームみたいに終わっちまった ゲームみたいに終わっちまった ゲームみたいに終わっちまった ゲームみたいに終わっちまった チュッ チュッ チュッ チューと リアル いつの間にかに 何もない チュッ チュッ チュッ チューと リアル 終わらなければいいのになあ ああ 心の中身を 探り合う事無く 言葉を交わし合う だけれどこれって やっぱりゲーム (そうだよ そうだよ) そもそも 住んでる世界が違う (そうだよ そうだよ) そういや見た目も 全然違う (そうだよ そうだよ) その上 時間の流れも違うし (そうだよ そうだよ) そんなのでも いいんだよ そう 何でもいいんだよ 興味ないから いいでしょう 不幸は 見ない 今日も チュッ チュッ チュッ チューと リアル 此処にあるのに 何かがない チュッ チュッ チュッ チューと リアル 終わらなければいいのになあ チュッ チュッ チュッ チューと リアル いつの間にかに 何もない チュッ チュッ チュッ チュートリアル 歩き出せたら いいのかなあ・・・・・・ コメント エンディングまで泣くんじゃないってMOTHER? -- 名無しさん (2011-11-14 22 01 12) 失恋の歌ですかね。「チューとリアル」の言い換えも可愛いです。 -- らり (2011-11-19 18 43 03) 最初で泣いてしまっても結局はゲームだから泣くなってことじゃないかな? -- 窓口 (2011-11-22 19 27 33) 名前 コメント
https://w.atwiki.jp/nickelfw/pages/20.html
戦士職 名前:ソード 性別:男 誕生日:11月12日 年齢:23 種族:人間 装備: 武器……ロングソード[1H/威力+4/C率5%]、ロングソード[1H/威力+4/C率5%] 防具……スプリントアーマー[装甲+5/体力+5/回避-10] 装飾……なし 職業スキル:二刀流 アクティブスキル: 戦闘……二刀流(40+40=80)、受け流し(80) 探索……察知(50)、奇襲(70) 生活……研磨(60) パッシブスキル:剣術/攻撃強化/防御強化/耐久力/麻痺耐性 魔法:なし 職業:剣術士 見た目:剣士 攻撃 19+2=21 防御 15+2=17 俊敏 17 器用 10 知能 7 容姿 16 幸運 8 精神 8 威力 21+4=25 装甲 17+5=22 抵抗 8 体力 21+17+10+5=53 攻撃成功率 73 魔法成功率 43 所持金: 所持品: 魔法職 名前:メイジ 性別:男 誕生日:11月10日 年齢:20 種族:人間 装備: 武器……ヘビースタッフ[2H/威力+5/命中+25/C率1%] 防具……ソフトレザー[装甲+3/体力+3] 装飾……なし 職業スキル:魔法強化、魔法適性(魔導術) アクティブスキル: 戦闘……突き(60)、回避(70) 探索……聞き耳(70)、魔物知識(70) 生活……占い(80) パッシブスキル:防御強化/知能強化/精神強化/炎の加護/再生 魔法:フラム 職業:魔導士 見た目:魔法使い 攻撃 10 防御 10+2=12 俊敏 10 器用 14 知能 18+2=20 容姿 16 幸運 5 精神 17+2=19 威力 12+5=17 装甲 17+3=20 抵抗 19 体力 22+3=25 攻撃成功率 40+25=65 魔法成功率 119 所持金: 所持品: 支援職 名前:リィス 性別:女性 誕生日:11月11日 年齢:22 種族:人間 装備: 武器……スピア[1H/威力+5/命中-10/C率7%] 防具……ソフトレザー[装甲+3/体力+3]、ラウンドシールド[装甲+1/体力+1] 装飾……なし 職業スキル:医療技術、魔法適性(祈祷術) アクティブスキル: 戦闘……防御の型(70)、ガード(60) 探索……観察(70)、採取知識(60) 生活……治療(80) パッシブスキル:魔法攻撃/知能強化/錯乱耐性/命中/根性 魔法:チャヤ 職業:祈祷士 見た目:僧兵の女性 攻撃 4 防御 17 俊敏 5 器用 18 知能 17+2=19 容姿 16 幸運 5 精神 17 威力 19+5=24 装甲 17+4=21 抵抗 17 体力 21+4=25 攻撃成功率 70-10=60 魔法成功率 112 所持金: 所持品:
https://w.atwiki.jp/akasatanahama/pages/130.html
概要 新しく種、作物を追加する。 テクスチャは、 作物(ブロック)が成長段階によって"textures/blocks/cropAluminium_stage_0.png"から"blocks/cropAluminium_stage_7.png"。 種が"textures/items/seedsAluminium.png"、作物が"textures/items/wheatAluminium.png"。 ソースコード AluminiumMod.java package tutorial.aluminiummod; import cpw.mods.fml.common.Mod; import cpw.mods.fml.common.Mod.EventHandler; import cpw.mods.fml.common.event.FMLPreInitializationEvent; import cpw.mods.fml.common.registry.GameRegistry; import net.minecraft.block.Block; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.item.Item; @Mod(modid = AluminiumMod.MOD_ID, name = AluminiumMod.MOD_NAME, version = AluminiumMod.MOD_VERSION) public class AluminiumMod { public static final String MOD_ID = "AluminiumMod"; public static final String MOD_NAME = "Aluminium Mod"; public static final String MOD_VERSION = "1.0.0"; public static Block cropAluminium; public static Item seedsAluminium; public static Item wheatAluminium; @EventHandler public void perInit(FMLPreInitializationEvent event) { // 作物ブロックのインスタンス生成。 cropAluminium = new BlockAluminiumCrop().setBlockName("cropAluminium").setBlockTextureName("cropAluminium"); GameRegistry.registerBlock(cropAluminium, "aluminium_crop"); // 種のインスタンス生成。 seedsAluminium = new ItemAluminiumSeeds().setUnlocalizedName("seedsAluminium").setTextureName("seedsAluminium"); GameRegistry.registerItem(seedsAluminium, "aluminium_seeds"); // 小麦のインスタンス生成。 wheatAluminium = new Item().setUnlocalizedName("wheatAluminium").setTextureName("wheatAluminium").setCreativeTab(CreativeTabs.tabMaterials); GameRegistry.registerItem(wheatAluminium, "aluminium_wheat"); } } BlockAluminiumCrop.java +長いので囲みます package tutorial.aluminiummod; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.block.Block; import net.minecraft.block.BlockCrops; import net.minecraft.block.IGrowable; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.init.Blocks; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.IIcon; import net.minecraft.util.MathHelper; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import net.minecraftforge.common.EnumPlantType; import net.minecraftforge.common.IPlantable; import net.minecraftforge.common.util.ForgeDirection; import java.util.ArrayList; import java.util.Random; public class BlockAluminiumCrop extends BlockCrops implements IPlantable, IGrowable { private IIcon[] iIcons; public BlockAluminiumCrop() { // BlockBushのコンストラクタでMaterialはMaterial.plantsを指定されている。 super(); // updateTickがランダムに呼ばれるようにする。 this.setTickRandomly(true); // ブロックの大きさを指定する。あたり判定やカーソルがあった時の枠の大きさに使われる。 float f = 0.5F; this.setBlockBounds(0.5F - f, 0.0F, 0.5F - f, 0.5F + f, 0.25F, 0.5F + f); // クリエイティブタブに表示されないようにする。 this.setCreativeTab(null); // 一瞬で破壊できるようにする。ツールを持っていても耐久値は消費しない。 this.setHardness(0.0F); // 設置時や歩行時の音の種類を指定する。 this.setStepSound(soundTypeGrass); // 統計にカウントされないようにする。(?) this.disableStats(); } /** その座標に設置できるか。 */ @Override public boolean canPlaceBlockAt(World world, int x, int y, int z) { return world.getBlock(x, y, z).isReplaceable(world, x, y, z) this.canBlockStay(world, x, y, z); // 以下はBlockBushでの実装。superを呼び出すと二重に判定されてしまうため変更した。 //return super.canPlaceBlockAt(world, x, y, z) this.canBlockStay(world, x, y, z); } /** そのブロックの上に設置できるか。 */ @Override protected boolean canPlaceBlockOn(Block block) { // 耕地の上のみ。 return block == Blocks.farmland; } /** 隣接ブロックが更新された時の処理。 */ @Override public void onNeighborBlockChange(World world, int x, int y, int z, Block block) { // 二重判定回避のためコメントアウト。実際、Blockクラスでは何もしていない。 //super.onNeighborBlockChange(world, x, y, z, block); this.checkAndDropBlock(world, x, y, z); } /** Tick更新時の処理。 */ @Override public void updateTick(World world, int x, int y, int z, Random random) { // ランダムに呼ばれる。 this.checkAndDropBlock(world, x, y, z); // 一つ上のブロックの光源レベルが9以上の時。 if (world.getBlockLightValue(x, y + 1, z) = 9) { // メタデータを取得。 int l = world.getBlockMetadata(x, y, z); // 成長限界に達していない時。 if (l 7) { // 成長しやすさを取得。 float f = this.func_149864_n(world, x, y, z); // 成長させるかを判定する。 if (random.nextInt((int) (25.0F / f) + 1) == 0) { // 一段階成長させる。 ++l; world.setBlockMetadataWithNotify(x, y, z, l, 2); } } } } /** 設置状態を維持できるかを確認し、維持できなければドロップする。 */ @Override protected void checkAndDropBlock(World world, int x, int y, int z) { // 維持できない時。 if (!this.canBlockStay(world, x, y, z)) { // ドロップする。 this.dropBlockAsItem(world, x, y, z, world.getBlockMetadata(x, y, z), 0); // 空気に上書きする。 world.setBlock(x, y, z, getBlockById(0), 0, 2); } } /** その座標で維持できるか。 */ @Override public boolean canBlockStay(World world, int x, int y, int z) { // 下のブロックが耕地かどうかを判定する。 return world.getBlock(x, y - 1, z).canSustainPlant(world, x, y - 1, z, ForgeDirection.UP, this); } /** 作物の種別を返す。 */ @Override public EnumPlantType getPlantType(IBlockAccess world, int x, int y, int z) { // IPlantableの実装。作物。耕地の上に設置する。 return EnumPlantType.Crop; } /** 作物ブロックのインスタンスを返す。 */ @Override public Block getPlant(IBlockAccess world, int x, int y, int z) { // IPlantableの実装。 return this; } /** 作物のメタデータを返す。 */ @Override public int getPlantMetadata(IBlockAccess world, int x, int y, int z) { // IPlantableの実装。 return world.getBlockMetadata(x, y, z); } /** 成長しやすさの数値を返す。 */ private float func_149864_n(World world, int x, int y, int z) { // 周囲の耕地、作物の状況を判定し、成長しやすさを算出する。 float f = 1.0F; Block block = world.getBlock(x, y, z - 1); Block block1 = world.getBlock(x, y, z + 1); Block block2 = world.getBlock(x - 1, y, z); Block block3 = world.getBlock(x + 1, y, z); Block block4 = world.getBlock(x - 1, y, z - 1); Block block5 = world.getBlock(x + 1, y, z - 1); Block block6 = world.getBlock(x + 1, y, z + 1); Block block7 = world.getBlock(x - 1, y, z + 1); boolean flag = block2 == this || block3 == this; boolean flag1 = block == this || block1 == this; boolean flag2 = block4 == this || block5 == this || block6 == this || block7 == this; for (int l = x - 1; l = x + 1; ++l) { for (int i1 = z - 1; i1 = z + 1; ++i1) { float f1 = 0.0F; if (world.getBlock(l, y - 1, i1).canSustainPlant(world, l, y - 1, i1, ForgeDirection.UP, this)) { f1 = 1.0F; if (world.getBlock(l, y - 1, i1).isFertile(world, l, y - 1, i1)) { f1 = 3.0F; } } if (l != x || i1 != z) { f1 /= 4.0F; } f += f1; } } if (flag2 || flag flag1) { f /= 2.0F; } return f; } /** あたり判定を返す。 */ @Override public AxisAlignedBB getCollisionBoundingBoxFromPool(World world, int x, int y, int z) { // あたり判定をなくす。 return null; } /** 不透明なブロックか。 */ @Override public boolean isOpaqueCube() { // 透明なブロックなのでfalseを返す。 return false; } /** 通常と同様に描画するか。 */ @Override public boolean renderAsNormalBlock() { return false; } /** 描画の種別を返す。 */ @Override public int getRenderType() { // 小麦などと同じ。四枚の板が上から見て「井」の形になるように配置され、そこにテクスチャが表示される。 return 6; } /** 種のアイテムを返す。 */ @Override protected Item func_149866_i() { return AluminiumMod.seedsAluminium; } /** 作物のアイテムを返す。 */ @Override protected Item func_149865_P() { return AluminiumMod.wheatAluminium; } /** ブロックをドロップさせる。 */ @Override public void dropBlockAsItemWithChance(World world, int x, int y, int z, int meta, float dropChance, int fortune) { super.dropBlockAsItemWithChance(world, x, y, z, meta, dropChance, fortune); // BlockCropで以下のようにオーバーライドされている。幸運レベルを0に固定。 //super.dropBlockAsItemWithChance(world, x, y, z, meta, dropChance, 0); } /** ドロップアイテムを返す。 */ @Override public Item getItemDropped(int meta, Random random, int fortune) { // 基本的に種を返すが、完全成長していたら作物を返す。 return meta == 7 ? this.func_149865_P() this.func_149866_i(); } /** ドロップ数を返す。 */ @Override public int quantityDropped(Random random) { return 1; } /** ドロップアイテムのリストを返す。 */ @Override public ArrayList ItemStack getDrops(World world, int x, int y, int z, int metadata, int fortune) { // 未成長なら種を、完全成長していたら作物が追加される。 ArrayList ItemStack ret = new ArrayList (); int count = quantityDropped(metadata, fortune, world.rand); for (int i = 0; i count; i++) { Item item = getItemDropped(metadata, world.rand, fortune); if (item != null) { ret.add(new ItemStack(item, 1, damageDropped(metadata))); } } // 以上はBlockでの実装。以下はBlockCrops出の実装。重複処理回避のため変更した。 //ArrayList ItemStack ret = super.getDrops(world, x, y, z, metadata, fortune); // // 完全成長の時。 if (metadata = 7) { // 幸運レベルにより判定回数が増加する。デフォルトは3回。 for (int i = 0; i 3 + fortune; ++i) { // 0~14 = 7 より、1/2の確率。 if (world.rand.nextInt(15) = metadata) { // 種を追加する。 ret.add(new ItemStack(this.func_149866_i(), 1, 0)); } } } return ret; } /** 対応するアイテムを返す。 */ @Override @SideOnly(Side.CLIENT) public Item getItem(World world, int x, int y, int z) { // 種を返す。 return this.func_149866_i(); } /** ブロックのテクスチャを返す。 */ @Override @SideOnly(Side.CLIENT) public IIcon getIcon(int side, int meta) { // メタデータの数値が異常だったら成長限界の値を使う。 if (meta 0 || meta 7) { meta = 7; } return this.iIcons[meta]; } /** ブロックのテクスチャを登録する。 */ @Override @SideOnly(Side.CLIENT) public void registerBlockIcons(IIconRegister register) { this.iIcons = new IIcon[8]; for (int i = 0; i this.iIcons.length; ++i) { this.iIcons[i] = register.registerIcon(this.getTextureName() + "_stage_" + i); } } /** 骨粉を使用できるか。 */ @Override public boolean func_149851_a(World world, int x, int y, int z, boolean isRemote) { // IGrowableの実装。完全成長していたらfalse。 return world.getBlockMetadata(x, y, z) != 7; } /** 骨粉を適用するか。 */ @Override public boolean func_149852_a(World world, Random random, int x, int y, int z) { // IGrowableの実装。 return true; } /** 骨粉を適用する。 */ @Override public void func_149853_b(World world, Random random, int x, int y, int z) { // IGrowableの実装。 this.func_149863_m(world, x, y, z); } /** 骨粉を使用した時の成長させる処理。 */ @Override public void func_149863_m(World world, int x, int y, int z) { // 成長段階を2以上5以下上昇させる。 int l = world.getBlockMetadata(x, y, z) + MathHelper.getRandomIntegerInRange(world.rand, 2, 5); // 成長限界を超えていたら抑える。 if (l 7) { l = 7; } // メタデータを設定する。 world.setBlockMetadataWithNotify(x, y, z, l, 2); } } ItemAluminiumSeeds.java package tutorial.aluminiummod; import net.minecraft.block.Block; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; import net.minecraft.item.ItemSeeds; import net.minecraft.item.ItemStack; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import net.minecraftforge.common.EnumPlantType; import net.minecraftforge.common.IPlantable; import net.minecraftforge.common.util.ForgeDirection; public class ItemAluminiumSeeds extends ItemSeeds implements IPlantable { private Block field_150925_a; // 土台となるブロックのインスタンス。使われていない。 //private Block soilBlockID; public ItemAluminiumSeeds() { super(AluminiumMod.cropAluminium, Blocks.farmland); // 以下はItemSeedsのコンストラクタ。 this.field_150925_a = AluminiumMod.cropAluminium; //this.soilBlockID = Blocks.farmland; //this.setCreativeTab(CreativeTabs.tabMaterials); } /** アイテムを使用した時の処理。 */ @Override public boolean onItemUse(ItemStack itemStack, EntityPlayer player, World world, int x, int y, int z, int side, float hitX, float hitY, float hitZ) { if (side != 1) { return false; } else if (player.canPlayerEdit(x, y, z, side, itemStack) player.canPlayerEdit(x, y + 1, z, side, itemStack)) { // 上からの使用で、プレイヤーが編集可能で、右クリックしたブロックが耕地であり、その上が空気の時。 if (world.getBlock(x, y, z).canSustainPlant(world, x, y, z, ForgeDirection.UP, this) world.isAirBlock(x, y + 1, z)) { // 作物を設置する。 world.setBlock(x, y + 1, z, this.field_150925_a); // スタック数を減らす。 --itemStack.stackSize; return true; } else { return false; } } else { return false; } } /** 作物の種別を返す。 */ @Override public EnumPlantType getPlantType(IBlockAccess world, int x, int y, int z) { // IPlantableの実装。作物。耕地の上に設置する。 return EnumPlantType.Crop; } /** 作物ブロックのインスタンスを返す。 */ @Override public Block getPlant(IBlockAccess world, int x, int y, int z) { // IPlantableの実装。 return field_150925_a; } /** 作物のメタデータを返す。 */ @Override public int getPlantMetadata(IBlockAccess world, int x, int y, int z) { // IPlantableの実装。 return 0; } } 解説 Block Block setTickRandomly(boolean needsRandomTick) trueにすると、updateTickがランダムなタイミングで呼ばれるようになる。 void setBlockBounds(float minX, float minY, float minZ, float maxX, float maxY, float maxZ) ブロックの大きさを設定する。 あたり判定やカーソルがあった時の枠の大きさに使われる。 Block disableStats() 統計にカウントされないようにする。(?) 正確な挙動を把握できていません。ご存知の方、ご教授いただければ幸いです。 boolean canPlaceBlockAt(World world, int x, int y, int z) その座標に設置できるか。 void onNeighborBlockChange(World world, int x, int y, int z, Block block) 隣接ブロックが更新された時の処理。 void updateTick(World world, int x, int y, int z, Random random) Tick更新時の処理。 boolean canBlockStay(World world, int x, int y, int z) その座標で維持できるか。 AxisAlignedBB getCollisionBoundingBoxFromPool(World world, int x, int y, int z) あたり判定を返す。 BlockのデフォルトではsetBlockBoundsの設定が適用される。 boolean isOpaqueCube() 不透明なブロックか。 boolean renderAsNormalBlock() 通常と同様に描画するか。 int getRenderType() 描画の種別を返す。 void dropBlockAsItemWithChance(World world, int x, int y, int z, int meta, float dropChance, int fortune) ブロックをドロップさせる。 Item getItemDropped(int meta, Random random, int fortune) ドロップアイテムを返す。 int quantityDropped(Random random) ドロップ数を返す。 ArrayList ItemStack getDrops(World world, int x, int y, int z, int metadata, int fortune) ドロップアイテムのリストを返す。 Item getItem(World world, int x, int y, int z) 対応するアイテムを返す。 Clientのみ。第三ボタンでのピックアップに使っている。 IIcon getIcon(int side, int meta) ブロックのテクスチャを返す。 void registerBlockIcons(IIconRegister register) ブロックのテクスチャを登録する。 BlockBush 植物系ブロックの親クラス。 boolean canPlaceBlockOn(Block block) そのブロックの上に設置できるか。 void checkAndDropBlock(World world, int x, int y, int z) 設置状態を維持できるかを確認し、維持できなければドロップする。 BlockCrops 小麦のクラス。 人参やジャガイモの親クラスでもある。 float func_149864_n(World world, int x, int y, int z) 成長しやすさの数値を返す。 周囲の耕地、作物の状況を判定し、成長しやすさを算出する。 privateメソッドなので、隠蔽して実装しなおしている。 Item func_149866_i() 種のアイテムを返す。 Item func_149865_P() 作物のアイテムを返す。 void func_149863_m(World world, int x, int y, int z) 骨粉を使用した時の成長させる処理。 IPlantable 植物用のインターフェース。 下のブロックの判定などに使う。 ここでは、種と作物(ブロック)が実装している。 EnumPlantType getPlantType(IBlockAccess world, int x, int y, int z) 作物の種別を返す。 Block getPlant(IBlockAccess world, int x, int y, int z) 作物ブロックのインスタンスを返す。 int getPlantMetadata(IBlockAccess world, int x, int y, int z) 作物のメタデータを返す。 IGrowable 骨粉を使用できるブロックのためのインターフェース。 boolean func_149851_a(World world, int x, int y, int z, boolean isRemote) 骨粉を使用できるか。 boolean func_149852_a(World world, Random random, int x, int y, int z) 骨粉を適用するか。 void func_149853_b(World world, Random random, int x, int y, int z) 骨粉を適用する。 使用例 オファレンMOD-[1.7.10]2.0.0で実装予定のオファレン草。 ただし、作物はオファレンの欠片で、成長段階数、成長判定、骨粉判定などは小麦と異なる予定。 コメント この項目に関する質問などをどうぞ。 名前
https://w.atwiki.jp/akasatanahama/pages/112.html
防御力の設定は、どうやるのですか。 - 新人もっだー 2015-12-23 11 41 45 訂正しました。addArmorMaterialの第三引数で、ヘルメット、チェストプレート、レギンス、ブーツの順で登録してください。 - Tom Kate 2015-12-23 14 09 17 一応コメントにて。耐久値を1600に設定していざ動かしてみたら、耐久値が17600になったので、計算してみたところ耐久値は設定されている値に16かけた数値みたいですね。 - 初心者modder 2016-01-20 14 54 07 ご指摘ありがとうございます。コードより確認し、addArmorMaterialの説明部分に追記しておきました。 - 赤砂蛇凪浜 2016-10-10 12 27 46 「ItemStack customCraftingMaterial」にブロックは指定できないのですか? - モアイさん 2016-10-04 19 14 00 返信遅くなり申し訳ありません。記述に間違いがありました。customCraftingMaterialはItem型です。修正しておきます。ブロックを指定する場合、Item.getItemFromBlockメソッドを使用してItem型として代入してください。 - 赤砂蛇凪浜 2016-10-10 12 22 34 「装備していると何かが起こる防具」を作る方法を教えてください。 - あるふぁ 2017-05-25 17 33 50 「何か」とは、具体的にどのようなことでしょうか。Item.onArmorTick(World, EntityPlayer, ItemStack)は、プレイヤーが装備している時に毎tick呼ばれます。ある程度のことはこのメソッドを利用することで実装できると思います。 - 赤砂蛇凪浜 2017-05-26 13 31 31 装備しているmob(プレイヤー)にポーション効果をつけたかったのですが、汎用性を高めるために、わかりにくくしてしまいました。すみません。ともかく、ありがとうございました。 - あるふぁ 2017-05-26 20 34 50 このソースコードをコピペしても金床で修理することが出来ません - 名無しさん 2017-06-11 15 31 00 ご指摘ありがとうございます。ArmorMaterial.customCraftingMaterialへの代入がaluminiumへの代入より先だったため、素材指定ができていませんでした。修正しておきました。ご確認ください。 - 赤砂蛇凪浜 2017-06-16 18 29 15 初心者ですが二日かかっても解決できなかった部分を解決できました。ソースコードを書いてくれた方、本当に感謝しています。ありがとうございます。 - 名無しさん 2017-08-07 09 32 11 上の「装備していると何かが起こる防具」を作る方法を教えてください。 - 名無しさん 2017-09-02 00 30 22 に被ってしまうと思いますが全ての防具スロットに着けているのを確認する方法がわかりません... - 名無しさん 2017-09-02 00 31 07 Item#onArmorTick(World, EntityPlayer, ItemStack)の第二引数を利用します。EntityPlayer#getCurrentArmor(int)を呼び出すと、プレイヤーが装備している防具をItemStackとして取得できます。引数は、3が頭、2が胴、1が脚、0が足になっていますので、ご注意ください。 - 赤砂蛇凪浜 2017-09-03 11 32 17
https://w.atwiki.jp/civilizationv/pages/68.html
初心者ガイド
https://w.atwiki.jp/legendofnorrath/pages/363.html
TUTORIAL8 - Unit Combat ~ユニット戦闘について~ このチュートリアルでは、ユニットによるRaidについて学びます。 *UnitによるRaidについて *アバターに対するRaidについて *戦闘行動の解決について *ダメージの授受について === プレイマットにあるあなたのユニットは、あなたのメインフェイズにおいて、Raidに参加させることができます。 もし、対戦相手が1体のユニットも設置していないクエストでRaidを行った場合、あなたのRaidは対戦相手のアバターに対して攻撃を行います。 Raidを開始するには、Raidを行いたいクエストの上にある旗のアイコンをクリックします。 そのクエストにある、あなたのReady状態のユニット全てがRaidに参加します。 あなたは、Raidを開始するにあたって、ユニットをExertする必要はありません。 あなたはユニットを置いたそのままの状態でRaidを開始できます。 同じクエストに置かれた、他のReady状態のユニットもRaidに参加します。 この Raid は、いわゆる攻撃側の行動である、ということを覚えておいてください。 さらに、Exert状態であったり、特別な理由で参加不可能であるユニット(攻撃に参加できないことを含む能力など)以外のユニットはすべてRaidに参加します。(仮に攻撃力が0であっても、です。) === あなたの Gnoll Guardは2対の相手のユニットと相対しています。 今はあなたのメインフェイズなので、あなたはRaidを開始することが可能です。 Raidを開始する前に、ユニットをプレイし、対等な状況にしておきましょう。 あなたの手札にあるGnoll Scoutを、クリックし、ドラッグしてクエストのForge the Noble Swordに設置しましょう。 === では、Raidを開始しましょう。クエストの右にある旗のアイコンで、あなたのすべてのReady状態のユニットによって、Raidを開始します。 Forge the Noble SwordのRaidアイコンをクリックし、そこでRaidを開始しましょう。 === 戦闘が始まりました!両サイドの4体すべてのユニットは戦闘要因となります。 プレイマット中央の戦闘アイコンは、あなたの”合計攻撃力”と対戦相手の”合計防御力”を示しています。どちらの番号も0から開始します。 戦闘には4つのステージがあり、以下のように発生します。 1.戦闘アクションを行います。 2.勝利者を決定します。 3.ダメージボーナスのために、カードをExertします。 4.ダメージを与えます。 どちらのプレイヤーも、攻撃側から交互に、戦闘中のアクションを起こすことができます。 今はあなたの行動ターンなので、あなたは何らかの行動を起こすか、パスすることが出来ます。 双方が続けてパスした時点で、あなたは 勝利者を決定 するフェイズに移行することを承諾したことになります。 === 攻撃側が選択可能な戦闘アクションは以下が含まれます。 *戦闘に参加しているカードをExertして、合計攻撃力に加える *あなたの戦闘要員の持つ、 攻撃時 に発動するアクションを起こす *Tacticカードをプレイする あなたは攻撃側で、最初の行動権を持っていますので、Gnoll ScoutをExertして合計攻撃力に加えましょう。 Gnoll Scoutをダブルクリックして、合計攻撃力に加えましょう。 このあたり、表現が微妙に難しいんですが、 攻撃するか、その他の能力を使うこと自体はトレードオフではありません。 が、Exertを含む場合、Exert自体は重ねられないので原則同時には出来ません。 もちろん、何らかの効果を用いて、Exert効果-Ready-Exert(戦闘)のような流れを起こすことは許容されます。 === Gnoll Scoutを攻撃に加えたことで、合計攻撃力が上昇していることを確認できます。 このカードの表示は暗くなり、Exertされたことを通知しています。 円の中に剣のアイコンは、あなたがこのカードを攻撃のためにExertしたことを表しています。これはあなたの次のターンまでReady状態になりません。 もちろん、Ready状態にする 効果 が別にあれば話は変わりますが。 === 防御側の行える行動は以下のようになります。 *戦闘に参加しているカードをExertして合計防御力に加える *あなたの戦闘要員の持つ、 防御時 に発動するアクションを起こす *Tacticカードをプレイする 彼女のユニットは防御時の能力がないため、あなたの対戦相手はパスし、あなたが3対0で戦闘に勝利しました。 パスをクリックして進めましょう。 この場合、相手のユニットが防御力0であることもあって、相手は何も出来ないわけです。 === アクションを起こす および 勝利者を決定する ステージは終了しました。 あなたはプレイマット中央に表示された剣で、攻撃側が勝利したことを確認できます。(防御側が勝利した場合は盾が表示され、引き分けの場合は両方が表示されます。) 今、あなたは ダメージボーナスのために、カードをExertする ステージにいます。あなたがダメージを与えることに決定しているため、ダメージを追加するためにカードを1枚選んで(もしくはカードが1枚しかない)Exertすることを通知されます。 あなたが1枚以上のダメージボーナスを持つカードを持っているなら、ダメージを加えるためによりボーナスの高いほうを残すよう、気をつけてください。あなたは1枚のみ選択することが出来ます! Gnoll Guardをダブルクリックして、ダメージボーナスを加えてください。 ここでの選択を、ダメージボーナスだけで判断するのは必ずとも正解とは言えません。 まず、前段階の勝利ありきの判断ですので、ここでの選択は良く考えておきましょう。 === Wild BarbarianとGnoll Runnerはどちらも1のHealthしか持っていません。あなたの与えた2ダメージは、彼女のユニットを両方片付けるには十分です。 あなたは追加のユニットをプレイし、Raidを再び行うのに十分なPowerを持っています。 === けれども、同じクエストにおける戦闘は、あなたのメインフェイズに1度のみです。これはつまり、2度目の戦闘はもう一方のクエストで行われなければいけない、ということです。 あなたの手札のEverfrost Grizzlyを、クエストのNote to Necloにクリックし、ドラッグしてください。 ここの判断も、実際はあなたのさじ加減です。 今、戦闘を行った2体のユニットはExertされていて、次のターンまでは無防備です。 次の相手のターンで攻撃されたときのために、そちら側に新たなユニットをプレイすることも可能です。 一転集中か、戦力分散か、状況を見て決めましょう。 === では、Note to Necloに設置したEverfrost GrizzlyでRaidを開始しましょう。クエストの左側にある旗のアイコンは、こちらからRaidを開始できることを示しています。この戦闘は、あなたのユニットとあなたの対戦相手のあばたーの間で行われます。 Note to NecloにあるRaidアイコンをクリックし、そのクエストにおけるRaidを開始しましょう。 === 今回は、道を阻む相手のユニットはいないため、あなたのユニットはあなたの対戦相手のアバターに対してRaidを開始します。 あなたは攻撃側なので、あなたが最初の行動を行います。あなたのGrizzlyをExertして、攻撃に加えるところから開始しましょう。 Everfrost Grizzlyをダブルクリックして、攻撃に加えましょう。 === あなたの対戦相手は彼女のアバターをExertして防御に加えたので、あなたは今2対2で引き分けました。あなたのGrizzlyは好敵手に出会ったようです。けれども、あなたは便利なTacticを手札に持っています。 Slashをダブルクリックし、Tacticをプレイしましょう。 好敵手に出会った ことに深い意味はありません。 イコール、引き分けたことを指しているわけです。 === Slashはあなたがダメージを受けていない戦闘要員を選択することで、1ダメージを与えます。Karlemaynを選択しましょう。 Karlemaynをクリックし、彼女を Slash しましょう。 === あなたがPlayした拡大版のTacticカードがPlaymatの中央に表示されました。これはTacticがプレイされ、カードが正しく捨て札として移動されたことを両者に示します。 あなたたちは双方パスしたため、戦闘は2対2で終了しました。戦闘は引き分けで終了し、双方のプレイヤーはダメージを与えます。 あなたの対戦相手は1ダメージを彼女のアバターに対して受け、その上であなたのGrizzlyも1ダメージを受けます。 Everfrost Grizzlyをクリックし、1ダメージを与えてください。 === あなたのプレイしたTacticのおかげで、あなたの対戦相手が1ダメージしか与えられなかったのに、あなたは2ダメージを与えたことになります。 ユニットは、プレイマットにおける管理統制を行う重要な道具です。 Raidによって対戦相手のユニットを一掃することで、あなたの対戦相手のアバターにプレッシャーを与えられます。あなたのユニットを防御用にプレイすることは、クエスト進行に効力を及ぼし、あなたのアバターを生かすために役立ちます。 戻る
https://w.atwiki.jp/mfiler2tutorial/
Minnu s Filer2とはなんですか? UNIX(Linux, FreeBSD, MacOSX)で動くファイラーです。 UNIXというのは普通のパソコンに入っているWindowsとは違う種類のパソコン(OS)です。 Windowsは事務処理やネットサーフィンをするのに向いていますが UNIXは大学のワークステーションやウェブサーバー、組み込み機器などに利用され プロフェッショナルな用途に向いています。 Minnu s Filer2はそのUNIX上でコンピューティング全般の操作を簡単にするために開発されました。 ファイラーというのはファイルのコピーや作成、プログラムの起動など基本的なコンピュータ操作全般を行います。同じことを行うのにUNIXではシェルというプログラムを使いますが ファイラーはそれをよりビュジュアル的に行います。 同じくそれをビュジュアル的に行うソフトにファイルマネージャーというものがありますが、こちらはキーボードよりマウスでの操作が主体です。 それにたいしてファイラーはキーボードでの操作が主体となっている点が異なります。 Minnu s Filer2はキーボード主体のファイラーの中でもコンソールという文字だけのインターフェースを使ったものです。シェルも同じようにコンソール上で動くのでMinnu s Filer2はシェルの一種だと見ることもできます。事実内部的にはシェルを内蔵しています。このようなソフトをビュジュアルシェルと呼ぶこともあります。Minnu s Filer2はファイラーの良さとシェルの良さを兼ね備えたソフトなのです。 ファイラーの歴史 歴史的にはファイラーは少し前のパーソナルコンピュータ上のOS, MS-DOS上で発展してきました。日本ではFD, 海外ではNorton Commanderというソフトがよく使われてきました。Windowsの時代になりMS-DOS時代のファイラーの流れを組むWindows用のファイラーもたくさん生まれましたが、Windowsに付属するエキスプローラーの出来が良かったこともあり、現在ではファイラーを使う人は少なくなっています。しかし、ファイラーには長い歴史があり、いいファイラーソフトが生まれれば、新規ユーザーも増えていくのではないかと考えています。最近はファイルマネージャー、ファイラーともにスクリプトを内蔵する傾向にあり、Minnu s Filer2もRubyを内蔵しています。スクリプトを内蔵すると単調な処理をスクリプトで自動化することができます。 インストール インストールはMinnu s Filer2ホームページを見てください。 まだパッケージが用意されていないので、少々敷居が高いと思います。 各OSのメンテナにパッケージ化を頼もうと思っています。 さあ、mfiler2を使ってみよう。まずはコピーだ! インストールが無事すめば、シェル上でmfiler2というコマンドを実行すればMinnu s Filer2が起動します。左右二つにディレクトリが表示されていると思います。 アクティブなディレクトリは上部のパス名表示部分が強調されています。 逆側のディレクトリをスリープディレクトリと呼びます。 コピーなどのファイル操作の処理は大体アクティブなディレクトリからスリープディレクトリにされます。 まずはコピーの下準備。ディレクトリを移動しましょう。 カーソルキー上下でカーソルが移動します。ディレクトリの上にカーソルを持っていってENTERキーを押せば、そのディレクトリの中に入ります。 逆にBSキーを押せば親ディレクトリに移動します。 カーソルキー左右を押せばアクティブなディレクトリを左右移動できます。 とりあえず、コピーのテストができるようにアクティブなディレクトリをコピーしてもいいような小さいファイルがあるディレクトリ、スリープディレクトリに/tmp, $HOME/tmpなど、一時ファイルを置けるディレクトリに移動してみましょう。 さあ、ファイルのコピーです。まずはファイルのマーク。スペースキーを押せばカーソル下のファイルがマークされます。 マークされたファイルは*がファイル名の横に表示されたはずです。 ここでF5キーかcキーを押せば、スリープディレクトリにマークされたファイルがコピーされるはずです。できましたか?mfiler2によるファイルコピー操作はこれだけです。わずらわしいディレクトリ指定など要りません。非常に直感的に簡単にコピーできる気がしませんか? 次はコピーしたファイルを削除してみましょう。スリープディレクトリに移動するため、左右どちらかのキーを押して、スリープディレクトリをアクティブにして、コピーされたファイルをマークしてください。その後、F8かdキーを押してください。確認の質問文が表示されます。Yesを選択してEnterキーを押してください。これでファイルがごみ箱($HOME/mtrashbox)に移動されます。誤操作で消したファイルは($HOME/mtrashbox)に置いてあるので、そこから復活させてください。本当にファイルを削除したい場合は、Dキーを押してメニューからdeleteを選択してください。ファイルが本当に削除されるはずです。 ファイルの移動は同様にディレクトリを移動して、ファイルをマークしたあとに、F6かmキーでできます。 いちいちファイル選択するのがめんどくさいよ!シェルなら*.cppとかで一括に選択できるのに! ごもっともです。そのためにMinnu s Filer2には豊富な一括マーク操作を用意しています。 まずは全体選択です。HOMEキーを押すとディレクトリ以外のファイルがすべて選択されます。これはマークするのではなくてマークを反転します。つまりすでに選択されていたファイルは逆にマークが外されます。これはいろいろ応用範囲が広いので、覚えて置いてください。 ENDキーを押すとディレクトリを含むすべてのファイルが選択されます。 「これだけだとシェルで言う*という機能しかないじゃん!*.cppとかの方が便利だ」 大丈夫です。mfiler2には*.cppなどのグロブ(ワイルドカード)によるマークもサポートしています。*を押してください。メニューが表示されたはずです。 glob mark (f)ileを選んでください。 glob_mark * , * , * , * と表示されたはずです。 *.cppのマーク場合 glob_mark *.cpp , * , * , * で全てのcppファイルがマークされます。 toggle mark?と聞かれますがnoと答えてください。 ほかの引数の意味。 第一引数はファイル名の指定で*.cppとすれば拡張子がcppのファイルをマークできます。 第二引数はユーザー名の指定でrootと指定すればrootのファイルがマークできます。 第三引数はグループ名の指定。 第四引数はパーミッションの指定です。 マークには反転マーク(toggle mark)と単なるマークオンがあります。 toggle markの使い方の例。 まず全ての*.cppファイルをマークする glob_mark *.cpp , * , * , * toggle mark? no 次に所有者がrootのファイルを取り除く glob_mark *.cpp , root , * , * toggle mark? yes 次にmから始まるcppファイルを取り除く glob_mark m*.cpp , * , * , * toggle mark? yes などという使い方ができます。 逆にtoggle mark? noの使い方は まず全ての*.cppファイルをマークする glob_mark *.cpp , * , * , * toggle mark? no 次に全ての*.cファイルをマークする glob_mark *.c , * , * , * toggle mark? no です。 ほかにも glob mark (f)ile ファイルのみのワイルドカードマーク glob mark (a)ll ディレクトリなども含むワイルドカードマーク glob mark (d)irectory ディレクトリのみのワイルドカードマーク glob mark (e)xecutable 実行ファイルのみのワイルドカードマーク glob mark (r)eadable 読み込み可能ファイルのみのワイルドカードマーク glob mark (w)ritable 書き込み可能ファイルのみのワイルドカードマーク glob mark (s)ymlink シンボリックリンクファイルのワイルドカードマーク regex mark (F)ile 正規表現によるマーク mark (c)lear マークのクリア mark a(l)l files ファイルのみのマークの反転 mark a(L)l 全てのファイルのマーク反転 mark with c(o)mparison 2画面時左右のファイルを比較して同じファイルのみマーク 一括マークができるのはカレントディレクトリだけじゃんか!カレントディレクトリ以下すべての*.cppファイルに操作が行いたい Fによるファイル検索の仮想ディレクトリを使えば可能です。F - allでカレントディレクトリ以下のすべてのファイルを表示できます。このあと*のマークメニューのグロブによるマークで*.cppとしてcppファイルを選択すればいいでしょう。Fは他にも、あるサイズ以下のファイルを表示したり、ある更新日のファイルを表示したりできます。 ファイルの編集がしたい!UNIXではプログラミングやシステム管理でテキストファイルの編集を多用するし。 編集したいファイルの上にカーソルを移動して、F4かeを押してください。環境変数$EDITORで指定したエディッタが立ち上がるはずです。この場合vimやemacs -nwなどコンソール上で動くものだと、編集途中にファイル操作などがしたくなったらCTRL-Zでサスペンドすることができます。サスペンドするとmfiler2のファイラー画面の下に番号とサスペンドしたファイルのファイル名が表示されるので、もう一度エディッタ画面に戻りたい場合はその番号のキー(1なら1キー)を押せば、またエディッタ画面に戻ることができます。 X-Windowシステム上のエディッタ(gvim, xemacs, geditなど)を使用したい場合はカスタマイズする必要があります。それは後述。 いちいちファイルを探すのが面倒だ。やっぱりシェルでファイル名を入力する方が早い そのためにmfiler2にはファイルのインクリメンタルサーチが実装されています。fか/キーを押してください。そして目的のファイル名を入力すれば、そのファイルにカーソルが移動します。Enterキーで確定です。migemoつきでmfiler2をコンパイルしていれば日本語ファイルもローマ字で検索することができます。日本語ファイルを含むコマンドをシェルから起動する場合とても大変ですがmfiler2を使えば、とても簡単に日本語ファイルを扱えます。 コピー、移動、削除、編集、以外のファイル操作は? ファイルの作成はF10かnです。%r%Q mark_new_fileと表示されるのでの間に作りたいファイル名を入力すればファイルが作成されます。 ディレクトリの作成も同様にF9かkで行えます。 ファイル名の改名はファイル名を変えたいファイルの上にカーソルを持っていってF2かrです。 するとコマンドラインに以下のように表示されるので %Q%r rename 改名前のファイル名 , 改名後のファイル名 を入力してEnterを押してください。このときCTRL-Wによる後方単語削除が便利につかえると思います。 マークしてF2かrを押すと正規表現による一括ファイル改名が行えます。 試しにアクティブディレクトリにa.cpp, b.cppというファイルを作ってください。 a.cpp, b.cppをマークしましょう。 そしてF2かrを押してください。 gsub_rename //, "" と表示されたはずです。 正規表現をご存知でない方はUNIXでは正規表現を多用するので、このさい勉強しておきましょう。 /(.+).cpp/, "¥¥1.c" と入力すると確認用のページが表示されるので、ちゃんとa.c, b.cに改名されているか確認してください。Yesを選択するとa.cppがa.cにb.cppがb.cに改名されたのがわかると思います。 Rubyを利用してこの機能を作成しているので正規表現はRubyに準拠しています。詳細はRubyのページや本を見てください。 ファイル操作は便利にできることは分かった。でも、それ以外の処理をするにはやっぱりシェルが必要だ! ご安心を。mfiler2はシェルを内蔵していて、カスタマイズ可能で高機能な補完機能がついたコマンドラインがあります。hかF10を押すとコマンドラインに移行します。そこで好きなコマンドを入力してEnterを押せば、そのコマンドが実行されます。 TABを押せば補完候補が上の方に表示されますが、さらにTABキーを押せば補完候補をカーソルキーで選択できます。 カーソル下のファイルに何かのコマンドを実行したい場合、そのファイルにカーソルを合わせてF11かxを押せば、便利です。(ほんとはファイル実行なんのですが、こういう利用法もあります) マークした複数のファイルにコマンドを実行したい場合はファイルをマークしてからENTERを押してください。 %mと表示されますが、%mはマークされた複数のファイルに変換されるマクロです。 cat %mならマークされいた全てのファイルの内容が全て表示されるはずです。 「最近のシェルは高機能だからなぁ。ヒストリ検索とかもあんの?」 あります。検索したい語を入力したあとCTRL-Rを入力すれば、その語を含むコマンドライン履歴が表示されメニューから選択できます。 Rubyスクリプトによる処理の自動化 Meta+x(Escを押してからすぐx。もしくはAlt + x)を押してください。そうすると$EDITORが立ち上がります。そこにRubyによるスクリプトを書けば処理を自動化することができます。 試しにマークした全てのファイルのファイル名の拡張子の前に連番を付ける処理を書いてみましょう。 まず連番を付けたいファイルをマークします。そしてMeta+xを押してRubyスクリプト編集用のエディッタを立ち上げましょう。 で、以下を入力します。 n = 1 adir_mark.each do |f| ret = (f.scan /(.+)\.(.+)/)[0] File.reanme f, ret[0] + n.to_s + ret[1] n += 1 end エディッタを保存して終了するとスクリプトを実行して良いか聞いてくるのでYesと答えてください。正しく実行されるはずです。a.txt, b.txt, c.txt -- a1.txt, b2.txt, c3.txtなど。 adir_markはmfiler2組み込みの関数で、マークされたファイルのファイル名の配列を返します。scanなどはRubyを勉強して理解してください。そんなに難しいことはしていません。 処理が気に入った場合、オリジナルのコマンドとしてmfiler2に登録しましょう。次のカスタマイズの章で登録の仕方を教えます。 カスタマイズ mfiler2をカスタマイズするには/usr/local/etc/.mfilerをホームディレクトリにコピーして$HOME/.mfilerを編集します。 エディッタをgvim, xemacs, geditなどXウィンドウ上のものを使いたい場合は $HOME/.mfilerに keycommand NOMETA, KEY_e, "*", "shell( %q%o xemacs %f , %f )" keycommand NOMETA, KEY_F4, "*", "shell( %q%o xemacs %f , %f )" を追加してください。 keycommandはキーバインドを設定するコマンドでNOMETA, KEY_eはMetaキー無しのeキーという意味で、"*"はカーソル下の拡張子はなんでもOKという意味、 "shell( %q%o xemacs %f , %f )"は実行するコマンドです。 %qはコマンド待ちをしないマクロ %oはコマンド実行後マークをクリアしないマクロ %fはカーソル下のファイル名に変換されるマクロです。 shellはシェルコマンドを実行するコマンドです。 この場合eキーを押せばxemacsが起動します。 オリジナルコマンドを追加する。登録する関数がset_renbanだとするとset_renbanの定義をmfiler内に追加して mfiler末尾の defmenu("my_commands", "(1) set_number_at_head", KEY_1, "set_number_at_head()", "(2) del_number_at_head", KEY_2, "del_number_at_head()" ); keycommand NOMETA, KEY_y, "*", "menu( my_commands )" を defmenu("my_commands", "(1) set_number_at_head", KEY_1, "set_number_at_head()", "(2) del_number_at_head", KEY_2, "del_number_at_head()", "(3) set_renban", KEY_3, "set_renban" ); keycommand NOMETA, KEY_y, "*", "menu( my_commands )" としてください。 yを押せばメニューが追加されているはずです
https://w.atwiki.jp/akasatanahama/pages/142.html
概要 レシピを追加する。 前のチュートリアルまで実装している段階でのコードである。 ソースコード 残念!ソースコードの追加実装などいらないのだよ!! あくまでも前のチュートリアルまで実装できていればだが、レシピの実装はjson側で行うため追加コードは必要ない。 アセット aluminium_block.json[recipe] src/main/resources/assets/aluminiummod/recipes/に配置する { "type" "minecraft crafting_shaped", "pattern" [ "###", "###", "###" ], "key" { "#" { "item" "aluminiummod aluminium" } }, "result" { "item" "aluminiummod aluminium_block" } } aluminium.json[recipe] { "type" "minecraft crafting_shapeless", "ingredients" [ { "item" "aluminiummod aluminium_block" } ], "result" { "item" "aluminiummod aluminium", "count" 9 } } 解説 MC1.12より、今までのレシピの登録方法が非推奨となり、代わりにjson形式でレシピを登録することになった。 その為、バニラにレシピを追加するだけのMODなら最悪@Modをつけたクラスを作成するだけでjavaに触れるのは終わる。 名称はそのままforge側に登録され、/recipeコマンドで使われるため作られるアイテムのレジスター名にするのが最適である。 まず、type要素でクラフトタイプを指定する。"minecraft crafting_shaped"で定形レシピ、minecraft crafting_shapelessで不定形レシピを指定する。 次に、定形レシピではpatternでレシピの形を指定し、その文字に当てはまるアイテムをkeyで指定する。 不定形レシピではingredientsで指定する。 最後に、resultで結果を登録する。 それぞれ で区切ってある前がMapのkey、後ろがvalueであると考えれば良い。 item要素で modid レジスター名 、count要素で個数、data要素でメタデータ(アイテムなのでblockstateは登録できない)を指定する。 アイテムの種類を増やしたいときはkey若しくはingredientsを下のように変更すれば良い。 +... 定形 "key" { "#" { "item" "aluminiummod aluminium" }, "A" { "item" "minecraft skull", "data" 4 }, 不定形 "ingredients" [ { "item" "aluminiummod aluminium_block" }, { "item" "minecraft skull", "data" 4 ], レシピ追加通知 MC1.12からの新機能として、「レシピブック」がある。 また、バニラのアイテムは入手したとき右上に「新規レシピ追加」という通知が出る。 今回はアイテムを大量に追加するMOD用に「レシピブック」とイベントを使って通知を出す。 (進捗のシステムを使ってレシピを出すことも出来るが、書くべきjsonファイル数が多くなる。そのやり方は進捗の追加チュートリアルで記載予定。) +... AluminiumMod.java クラス末尾に追加する。 @Mod.Instance("aluminiummod") public static AluminiumMod aluminiumInstance; @Mod.EventHandler public void init(FMLInitializationEvent event) { HOLDER.register(); } //アイテムを拾ったときのイベント。 @SubscribeEvent public void onPickupItem(EntityItemPickupEvent event) { this.aluminiumUnlockRecipes(event.getItem().getItem(), event.getEntityPlayer()); } //コンテナを閉じたとき(チェストやプレイヤーインベントリなど)のイベント。 @SubscribeEvent public void onCloseContainer(PlayerContainerEvent.Close event) { for (ItemStack itemStack event.getEntityPlayer().inventoryContainer.getInventory()) { this.aluminiumUnlockRecipes(itemStack, event.getEntityPlayer()); } } private void aluminiumUnlockRecipes(ItemStack stack, EntityPlayer player) { if (FMLCommonHandler.instance().getSide().isClient()) { Item item = stack.getItem(); int meta = stack.getMetadata(); ItemStack itemStack = new ItemStack(item, 1, meta); //もしレシピを保持するリストに合致すれば if (!this.HOLDER.map.isEmpty() this.HOLDER.map.containsKey(itemStack)) { List ResourceLocation list = this.HOLDER.map.get(itemStack); //player.unlockRecipes(ResourceLocation[] locations)でレシピブックに追加する。 player.unlockRecipes(list.toArray(new ResourceLocation[list.size()])); } } } AluminiumRecipeHolder.java レシピをリソースから読み取って保持するクラス。 package com.tntmodders.tutorial; import com.google.gson.Gson; import com.google.gson.JsonObject; import com.google.gson.stream.JsonReader; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.util.ResourceLocation; import net.minecraftforge.fml.common.FMLCommonHandler; import java.io.*; import java.net.URL; import java.util.*; import java.util.jar.JarEntry; import java.util.jar.JarFile; public class AluminiumRecipeHolder { //ItemStackよりそのアイテムが鍵となるレシピを取得できるようにする。 public static final Map ItemStack, List ResourceLocation map = new ItemStackHashMap(); public void register() { if (FMLCommonHandler.instance().getSide().isClient()) { //assets/ modid /recipes/よりリソースを取得する。 this.getResource("assets/aluminiummod/recipes/"); } } public void getResource(String path) { ClassLoader loader = AluminiumMod.class.getClassLoader(); URL url = loader.getResource(path); //jarファイル内か否かで処理が変化する。 if (url.getProtocol().equals("jar")) { String[] strings = url.getPath().split(" "); String leadPath = strings[strings.length - 1].split("!")[0]; File f = new File(leadPath); JarFile jarFile; try { //jarファイル自体を取得する。(zipファイル・jarファイルとして扱う事ができる。) jarFile = new JarFile(f); Enumeration JarEntry enumeration = jarFile.entries(); while (enumeration.hasMoreElements()) { JarEntry entry = enumeration.nextElement(); String s = entry.getName(); if (s != null s.startsWith(path) s.endsWith(".json")) { InputStream stream = null; try { stream = loader.getResourceAsStream(s); //inputstreamを使ってjarファイル内のjsonを読み込む。 this.readStream(stream, s); stream.close(); } catch (Exception e) { e.printStackTrace(); } } } } catch (IOException e) { e.printStackTrace(); } } else { List File list = this.getListFile(path); if (list.size() 0) { for (File recipe list) { InputStream stream = null; try { stream = new FileInputStream(recipe); this.readStream(stream, recipe.getName()); stream.close(); } catch (Exception e) { e.printStackTrace(); } } } } } //ファイルを全て取得する。これもjarか否かによって変わる。 private List File getListFile(String path) { List File files = new ArrayList (); ClassLoader loader = AluminiumMod.class.getClassLoader(); URL url = loader.getResource(path); if (url.getProtocol().equals("jar")) { String[] strings = url.getPath().split(" "); String leadPath = strings[strings.length - 1].split("!")[0]; File f = new File(leadPath); JarFile jarFile; try { jarFile = new JarFile(f); Enumeration JarEntry enumeration = jarFile.entries(); while (enumeration.hasMoreElements()) { JarEntry entry = enumeration.nextElement(); String s = entry.getName(); if (s != null s.startsWith(path) s.endsWith(".json")) { files.add(new File(loader.getResource(s).getPath())); } } } catch (IOException e) { e.printStackTrace(); } } else { File packFile = FMLCommonHandler.instance().findContainerFor(AluminiumMod.aluminiumInstance).getSource(); File newFile = new File(packFile.toURI().getPath() + path); files = Arrays.asList(newFile.listFiles()); } return files; } private void readStream(InputStream stream, String name) { //inputstreamよりJSONを読み込む。 JsonReader reader = new JsonReader(new InputStreamReader(stream)); JsonObject jsonObject = new Gson().fromJson(reader, JsonObject.class); //文字列の中にパスが紛れ込んだ場合それを消す。また、".json"を抜いてResourceLocationとして保存する。 ResourceLocation location = new ResourceLocation("aluminiummod", name.replaceAll("assets/aluminiummod/recipes/", "") .replaceAll(".json", "")); //定形レシピでキーを"#"にしたアイテムを鍵とする。 if (jsonObject.has("key") jsonObject.getAsJsonObject("key").has("#")) { Item item = Item.getByNameOrId(jsonObject.getAsJsonObject("key").getAsJsonObject("#").get("item").getAsString()); int i = 0; if (jsonObject.getAsJsonObject("key").getAsJsonObject("#").has("data")) { i = jsonObject.getAsJsonObject("key").getAsJsonObject("#").get("data").getAsInt(); } ItemStack stack = new ItemStack(item, 1, i); List ResourceLocation locations = map.containsKey(stack) ? map.get(stack) new ArrayList ResourceLocation (); locations.add(location); map.put(stack, locations); } //不定形レシピで一番上に書いたアイテムを鍵とする。 else if (jsonObject.has("ingredients") jsonObject.getAsJsonArray("ingredients").get(0).getAsJsonObject().has("item")) { String s = jsonObject.getAsJsonArray("ingredients").get(0).getAsJsonObject().get("item").getAsString(); Item item = Item.getByNameOrId(s); int i = 0; if (jsonObject.getAsJsonArray("ingredients").get(0).getAsJsonObject().has("data")) { i = jsonObject.getAsJsonArray("ingredients").get(0).getAsJsonObject().get("data").getAsInt(); } ItemStack stack = new ItemStack(item, 1, i); List ResourceLocation locations = map.containsKey(stack) ? map.get(stack) new ArrayList ResourceLocation (); locations.add(location); map.put(stack, locations); } } //ItemStackを使ったマップを定義する。 public static class ItemStackHashMap K extends ItemStack, V extends List ResourceLocation extends HashMap K, V { public V get(Object key) { if (key instanceof ItemStack this.containsKey(key)) { for (Map.Entry K, V entry this.entrySet()) { if (entry.getKey().getItem() == ((ItemStack) key).getItem() entry.getKey().getMetadata() == ((ItemStack) key).getMetadata()) { return entry.getValue(); } } } return null; } @Override public boolean containsKey(Object key) { if (key instanceof ItemStack) { ItemStack itemStack = ((ItemStack) key); for (ItemStack stack this.keySet()) { if (stack.getItem() == itemStack.getItem() stack.getMetadata() == itemStack.getMetadata()) { return true; } } } return false; } } } コメント この項目に関する質問などをどうぞ。 名前
https://w.atwiki.jp/buraburage/pages/21.html
最初の方の手順 1) ソーラー・プラント (Level 1) 2) メタル採掘所 (Level 1) 3) メタル採掘所 (Level 2)【70%に下向】 4) ソーラー・プラント (Level 2)【メタル100%に復旧】 5) メタル採掘所 (Level 3) 6) クリスタル採掘所 (Level 1)【70%に下向】 7) ソーラー・プラント (Level 3)【クリ100%に復旧】 8) メタル採掘所 (Level 4) 9) メタル採掘所 (Level 5)【90%(-4)または80%(+4)に下向】 10) ソーラー・プラント (Level 4)【メタル100%に復旧】 11) クリスタル採掘所 (Level 2) 12) クリスタル採掘所 (Level 3)【90%に下向】 13) ソーラー・プラント (Level 5)【クリ100%に復旧】 14) デューテリウム・シンセサイザー (Level 1) 15) クリスタル採掘所 (Level 4)【エネルギー-1だが問題ない】 16) ソーラー・プラント (Level 6) 17) メタル採掘所 (Level 6) 18) メタル採掘所 (Level 7)【90%に下向】 19) ソーラー・プラント (Level 7)【メタル100%に復旧】 20) クリスタル採掘所 (Level 5) 21) デューテリウム・シンセサイザー (Level 2) 22) ソーラー・プラント (Level 8) 23) デューテリウム・シンセサイザー (Level 3) 24) デューテリウム・シンセサイザー (Level 4) 25) デューテリウム・シンセサイザー (Level 5)【80%に下向(-3)】 26) ロボティクス工場 (Level 1) 27) リサーチセンター (Level 1) 28) ロボティクス工場 (Level 2) 29) エネルギー技術 (Level 1) 30) 造船所 (Level 1) 31) ソーラー・プラント (Level 9)【デュー100%に復旧】 32) 燃焼ドライブ (Level 1)【軽戦闘艦】 33) クリスタル採掘所 (Level 6) 34) 造船所 (Level 2) 35) デューテリウム・シンセサイザー (Level 6)【80%に下向】 36) 燃焼ドライブ (Level 2)【小型輸送機】 37) ソーラー・プラント (Level 10) 38) リサーチセンター (Level 2) 39) メタル採掘所 (Level 8) 40) ソーラー・プラント (Level 11)【デュー100%に復旧】 41) メタル採掘所 (Level 9) 42) リサーチセンター (Level 3) 43) スパイ活動技術 (Level 1) 44) コンピューター技術 (Level 1) 45) スパイ活動技術 (Level 2) 46) クリスタル採掘所 (Level 7) 47) ソーラー・プラント (Level 12) 48) メタル採掘所 (Level 10) 49) デューテリウム・シンセサイザー (Level 7) 50) 造船所 (Level 3) 51) エネルギー技術 (Level 2) 52) 燃焼ドライブ (Level 3)【偵察機】 53) レーザー技術 (Level 1) 完了すれば: メタル採掘所 (Level 10) クリスタル採掘所 (Level 7) デューテリウム・シンセサイザー (Level 7) ソーラー・プラント (Level 12) 造船所 (Level 3) リサーチセンター (Level 3) ロボティクス工場 (Level 2) 燃焼ドライブ (Level 3) エネルギー技術 (Level 2) レーザー技術 (Level 1) コンピューター技術 (Level 1) スパイ活動技術 (Level 2)